From 113d21801b4550058d10cd324da24f688c903793 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Tue, 8 Sep 2009 11:48:20 +0200 Subject: [PATCH] Fix handling of window cursor wrt grabs Even for grabs we need to recurse up to look for what cursor to use. --- gdk/gdkwindow.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 40176b2bf4..7820d46113 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -8599,28 +8599,36 @@ _gdk_window_event_parent_of (GdkWindow *parent, static void update_cursor (GdkDisplay *display) { - GdkWindowObject *pointer_window, *cursor_window, *parent, *toplevel; + GdkWindowObject *cursor_window, *parent, *toplevel; + GdkWindow *pointer_window; GdkWindowImplIface *impl_iface; GdkPointerGrabInfo *grab; - pointer_window = (GdkWindowObject *)display->pointer_info.window_under_pointer; - - cursor_window = pointer_window; - while (cursor_window->cursor == NULL && - (parent = get_event_parent (cursor_window)) != NULL && - parent->window_type != GDK_WINDOW_ROOT) - cursor_window = parent; + pointer_window = display->pointer_info.window_under_pointer; /* We ignore the serials here and just pick the last grab we've sent, as that would shortly be used anyway. */ grab = _gdk_display_get_last_pointer_grab (display); - if (grab != NULL && - !_gdk_window_event_parent_of (grab->window, (GdkWindow *)cursor_window)) + if (/* have grab */ + grab != NULL && + /* the pointer is not in a descendant of the grab window */ + !_gdk_window_event_parent_of (grab->window, pointer_window)) + /* use the cursor from the grab window */ cursor_window = (GdkWindowObject *)grab->window; + else + /* otherwise use the cursor from the pointer window */ + cursor_window = (GdkWindowObject *)pointer_window; + + /* Find the first window with the cursor actually set, as + the cursor is inherited from the parent */ + while (cursor_window->cursor == NULL && + (parent = get_event_parent (cursor_window)) != NULL && + parent->window_type != GDK_WINDOW_ROOT) + cursor_window = parent; /* Set all cursors on toplevel, otherwise its tricky to keep track of * which native window has what cursor set. */ - toplevel = (GdkWindowObject *)get_event_toplevel ((GdkWindow *)pointer_window); + toplevel = (GdkWindowObject *)get_event_toplevel (pointer_window); impl_iface = GDK_WINDOW_IMPL_GET_IFACE (toplevel->impl); impl_iface->set_cursor ((GdkWindow *)toplevel, cursor_window->cursor); } -- 2.30.2